import { NgModule, SkipSelf, Optional } from '@angular/core';
import { SharedModule } from './../shared/shared.module';
import { HttpModule } from '@angular/http';
import { MdIconRegistry } from '@angular/material';
import { DomSanitizer } from '@angular/platform-browser';
import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
import { SidebarComponent } from './sidebar/sidebar.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { loadSvgResources } from '../utils/svg.util';

// exports 不导出只能在本模块下使用
@NgModule({
  imports: [
    SharedModule,
    HttpModule,
    BrowserAnimationsModule
  ],
  declarations: [
    HeaderComponent,
    FooterComponent,
    SidebarComponent,
  ],
  exports: [
    HeaderComponent,
    FooterComponent,
    SidebarComponent,
  ]
})
// 希望该模块只加载一次，将CoreModule作为构造器参数传入，然后判断是否已经加载。
// 直接这么写是危险的因为出现了无限循环的情况
// 避免无限循环,使用@SkipSelf()注解，表示去父级的池中寻找
// 第一次系统加载时不存在，@Optional()注解表示这个依赖时可选的，不存在就正常执行构造器
export class CoreModule {
  constructor(
    @Optional() @SkipSelf() parent: CoreModule,
    ir: MdIconRegistry,
    ds: DomSanitizer
  ) {
    if (parent) {
      throw new Error('模块已经存在,不能重复加载!');
    }

    loadSvgResources(ir, ds);

  }
}
